package com.morgan.storageperlib

import android.content.Intent
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.morgan.storageperlib.entity.BaseActivityResultHandler

/**
 *description：针对android 11的外部存储目录的处理，可以直接读取/mnt/sdcard目录，但不能访问内部存储（/data/data/packagename/）和外部存储-App私有目录(/mnt/sdcard/Android/data/packagename/)
 * 必须在activity或者Fragment的onCreate中初始化
 *<br>author：caowugao
 *<br>time：2021/3/8 0008 17:42
 */
class ExternalStorageForRHandler(act : AppCompatActivity, contract : ActivityResultContract<Intent, ActivityResult> = ActivityResultContracts.StartActivityForResult(), private val callback : (Boolean) -> Unit) : BaseActivityResultHandler(act, contract, { result ->
    callback.invoke(Build.VERSION.SDK_INT >= 30 && Environment.isExternalStorageManager())
}) {
    /**
     * 假若App开启了分区存储功能，当App运行在Android 10.0的设备上时，是没法遍历/sdcard/目录的。
     * 而在Android 11.0上运行时是可以遍历的，需要进行如下几个步骤。
     * https://www.jianshu.com/p/d5573e312bb8
     */

    fun launch() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            callback.invoke(false)
            return
        }
        //检查是否已经有权限
        if (!Environment.isExternalStorageManager()) {
            //跳转新页面申请权限
            launcher.launch(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION))
        } else {
            callback.invoke(true)
        }
    }
}